import { interval, switchMap, from, take } from "rxjs";

/* 
from(1)
from([1, 2, 3])
from(Promise.resolve) 
*/

const source$ = interval(1000)
  //使用 take 操作符限制了 source$ 只会发出 3 个值（0、1、2）
  .pipe(take(3))
  .pipe(
    //可以支持异步，可以支持Promise
    //switch的意思是如果上游产生了新的值，那么上一个产出的值对应的Observable就不要了
    // switchMap 的行为非常类似于 map 操作符，
    // 但有一个重要的区别：它会取消订阅之前的 Observable，并订阅最新的 Observable。
    // 这意味着，如果有多个 Observable 输出，只会发出最新的 Observable 的输出

    // .pipe(take(3)) 会向 switchMap 传递三个 Observable， 但 switchMap 只会保留最新的一个
    switchMap((val) =>
      from(
        new Promise((resolve) => {
          setTimeout(() => resolve(val), 2000);
        })
      )
    )
  );
source$.subscribe(console.log);
